public class LC0283 {
    /**
     * 扫描两遍，第一遍将非零数字写到左端，用指针writePtr指向已处理完的序列的末尾；第二遍从writePtr出发，向序列中填入0.
     */
    public void moveZeroes(int[] nums) {
        int length = nums.length;

        int writePtr = 0, scanPtr = 0;
        for (; scanPtr < length; scanPtr++) {
            if (nums[scanPtr] != 0) nums[writePtr++] = nums[scanPtr];
        }
        for (; writePtr < length; writePtr++) {
            nums[writePtr] = 0;
        }
    }

    /**
     * LeetCode官方解法，左指针指向已处理完序列的尾部，右指针对序列进行扫描。每当右指针发现非零数字时，左右指针指向的数字交换；否则仅右指针移动。
     * 这种做法和扫描两遍的做法，在时间复杂度上并没有差别。但是“双指针”的味道更浓一点。
     */
    public void moveZeroes2(int[] nums) {
        int length = nums.length;

        int writePtr = 0, scanPtr = 0;
        for (; scanPtr < length; scanPtr++) {
            if (nums[scanPtr] != 0) {
                int tmp = nums[writePtr];
                nums[writePtr++] = nums[scanPtr];
                nums[scanPtr] = tmp;
            }
        }
    }
}
